/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package moonnms.libs;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;

/**
 *
 * @author Di_Moon
 */
public class libNMSTools {
    
    // Возвращает массив в котором единицей отмечены порты, которые битово
    // закодированы в шестнадцатеричном числе. Применяется для парсинга hex 
    // значения запроса SNMP влан-порты
    public static ArrayList<Integer> sw_GetPortsFromHex(String hex) {
        int position;
        try {
            position = Integer.parseInt(hex, 16);
        } catch (Exception e) {
            return new ArrayList();
        }
        int maxBit = (hex.length()*4)-1;
        ArrayList<Integer> ports = new ArrayList(Collections.nCopies(maxBit+1,0));
        
//        System.out.println(Integer.toBinaryString(position));
        
        for(int i=maxBit; i>=0; i--) {
            int num = 1 << i;
            if((position & num) > 0) {
                ports.set(maxBit-i, 1);
            } else {
                ports.set(maxBit-i, 0);
            }
        }
        return ports;

    }
    
    // Возвращает 16-ричную строку, в которой закодированы принадлежность vlan
    // к порту для отправки запроса по SNMP
    public static String sw_ConvertPortListToHex(ArrayList portList, String portPattern) {
        
        // Проверим, чтоб количество элементов было не больше максимального количества портов
        int maxPorts = portPattern.split(":").length * 8;
        if(portList.size() > maxPorts) return null;

        StringBuffer sb = new StringBuffer();
        StringBuffer retVal = new StringBuffer();
        
//        System.out.println(portList);
        
        // Формируем битовую строку
        for(int i=0; i<maxPorts; i++) {
            if(i < portList.size()) {
                if(portList.get(i) == 1) {
                    // Порт №i принадлежит влану
                    sb.append("1");
                } else {
                    // Порт №i не принадлежит влану
                    sb.append("0");
                }
            } else {
                sb.append("0");
            }
        }
        
//        System.out.println("BitString="+sb.length());
        
        // формируем из битовой строки шестнадцатеричную
        int dbl=0;
        for(int j=0; j<sb.length(); j += 4) {
            String subBits = sb.substring(j, j+4);
//          System.out.println("subBits"+subBits);
            String subHex = Integer.toHexString(Integer.parseInt(subBits, 2));
            retVal.append(subHex);
            dbl += 1;
            if(dbl==2) {
                dbl = 0;
                retVal.append(":");
            }
        }
        retVal.deleteCharAt(retVal.length()-1);
        return retVal.toString();
        
    }
    
    // Возвращает максимальное значение индекса HashMap
    public static int hashmap_GetMaxIndex(HashMap hashmap) {
        return (Integer)Collections.max(hashmap.keySet());
    }
}
